import { PostComments, Share } from '@/app/(home)/posts/[slug]/page.client'; import { PostJsonLd } from '@/components/json-ld'; import { Section } from '@/components/section'; import { TagCard } from '@/components/tags/tag-card'; import { createMetadata } from '@/lib/metadata'; import { metadataImage } from '@/lib/metadata-image'; import { type Page as MDXPage, getPost, getPosts } from '@/lib/source'; import { cn } from '@/lib/utils'; import { File, Files, Folder } from 'fumadocs-ui/components/files'; import { InlineTOC } from 'fumadocs-ui/components/inline-toc'; import { Tab, Tabs } from 'fumadocs-ui/components/tabs'; import defaultMdxComponents from 'fumadocs-ui/mdx'; import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; import Balancer from 'react-wrap-balancer'; import { description as homeDescription } from 'src/app/layout.config'; function Header(props: { page: MDXPage; tags?: string[] }) { const { page, tags } = props; return (

{page.data.title}

{page.data.description}

{tags?.map((tag) => ( ))}
); } export default async function Page(props: { params: Promise<{ slug: string }>; }) { const params = await props.params; const page = getPost([params.slug]); if (!page) notFound(); const { body: Mdx, toc, tags, lastModified } = page.data; const lastUpdate = lastModified ? new Date(lastModified) : undefined; return ( <>

Written by

{page.data.author}

Created At

{new Date(page.data.date ?? page.file.name).toDateString()}

{lastUpdate && (

Updated At

{lastUpdate.toDateString()}

)}
); } export async function generateMetadata(props: { params: Promise<{ slug: string }>; }): Promise { const params = await props.params; const page = getPost([params.slug]); if (!page) notFound(); const title = page.data.title; const description = page.data.description ?? homeDescription; return createMetadata( metadataImage.withImage(page.slugs, { title, description, openGraph: { url: `/posts/${page.slugs.join('/')}`, }, alternates: { canonical: page.url, }, }), ); } export function generateStaticParams(): { slug: string | undefined }[] { return getPosts().map((page) => ({ slug: page.slugs[0], })); }